package Exceptions;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/9/23 21:09
 *      异常：在Java中，将程序执行过程中发生的不正常行为称为异常。  编译阶段语法错误不是异常
 *          1. 算术异常  Exception in thread "main" java.lang.ArithmeticException: / by zero
 *          2. 数组越界异常 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
 *          3. 空指针异常     Exception in thread "main" java.lang.NullPointerException
 *
 *       异常的继承体系：
 *          1. Throwable：是异常体系的顶层类，其派生出两个重要的子类, Error 和 Exception
 *          2. Error：指的是Java虚拟机无法解决的严重问题，比如：JVM的内部错误、资源耗尽等，典型代表：
 *              StackOverflowError（栈溢出）和OutOfMemoryError（堆溢出），一旦发生回力乏术。
 *          3. Exception：异常产生后程序员可以通过代码进行处理，使程序继续执行。比如：感冒、发烧。
 *          我们平时所说的异常就是Exception 及其子类 。
 *
 *       分类：  根据发生的时机不同
 *          1. 编译时异常 受检查异常 ：在程序编译期间发生的异常，称为编译时异常，也称为受检查异常(Checked Exception)
 *              IOException，SQLException ....
 *          2. 运行时异常 非受检查异常：在程序执行期间发生的异常，称为运行时异常，也称为非受检查异常(Unchecked Exception)
 *              Error 和 RuntimeException及其子类  NPE ，越界，8算术运算。。。
 *
 *       处理： 1. try{ //所有有可能产生异常的代码块
 *                       }catch（要捕获的异常类型）{
 *                           //出现异常后执行的代码
 *                       }finally{//可选
 *                           //无论是否产生异常，一定会执行的代码块（除了执行System.exit()强制中断进程）
 *                           //资源类的关闭 放在finally 代码块
 *                       }
 *                  catch只能捕获（）相对应的异常类型，可以采用多个catch块捕获异常
 *                  若在某段代码中可能产生多个异常，推荐使用多个catch块捕获异常
 *                  也可以使用他们的父类Exception 直接捕获
 *
 *                  补充：可以通过在catch中调用 e.printStackTrace();  可以打印出具体的异常原因以及产生的位置
 *                  System.err.println("算数异常"); err错误输出，会在控制台输出红色内容，优先级低于标准输出
 *              2.通过Throws 向上抛出异常
 *

 */
public class Demo {
    public static void main(String[] args) {
        System.out.println("before Exception!");
        //发生异常
        try {
            System.out.println(10/0);//产生算数异常
            String s = null;
            System.out.println(s.length());//只可能捕获一个异常，这一行不执行
        }catch (NullPointerException e ){//捕获空指针异常，不匹配，catch失败
            System.out.println("NPE异常");
        }catch (ArithmeticException e ){//多个catch块捕获
            System.err.println("算数异常");
            //可以打印出具体的异常原因以及产生的位置
            e.printStackTrace();
        }
        finally {
            System.out.println("处理完毕！");
        }
        System.out.println("after Exception!");
    }
}
